package ubadbtools.deadlockAnalyzer.grafo;

public class ListaAdy {
	Ady primero;
	ListaAdy proximo;

	public ListaAdy() {
		this.primero = null;
	}

	ListaAdy proximo() {
		return proximo;
	}

	void proximo(ListaAdy p) {
		proximo = p;
	}

	Ady primero() {
		return primero;
	}

	void primero(Ady p) {
		primero = p;
	}

	boolean vacia() {
		return (this.primero == null);
	}

	boolean existe(int v) {
		if (!this.vacia())
			return (this.primero.igual(v) || this.proximo.existe(v));
		else
			return false;
	}

	void agregar(int v) {
		ListaAdy aux;
		if (!this.existe(v)) {
			aux = new ListaAdy();
			aux.primero(this.primero);
			aux.proximo(this.proximo);
			primero = new Ady(v);
			proximo = aux;
		}
	}

	void eliminar(int v) {
		ListaAdy aux;
		if (!this.vacia()) {
			if (this.primero.igual(v)) {
				aux = proximo.proximo();
				primero = proximo.primero();
				proximo.primero = null;
				proximo = aux;
			} else
				proximo.eliminar(v);
		}
	}

	void asociarDato(int v, Object p) {
		if (!this.vacia())
			if (primero.igual(v))
				primero.asociarDato(p);
			else
				proximo.asociarDato(v, p);

		else

			System.out
					.print("Error (94) Obtener o Asociar Datos de un eje no existente.");
		// runerror(94);

	}

	Object obtenerDato(int v) {

		if (!this.vacia())
			if (primero.igual(v))
				return primero.obtenerDato();
			else
				return proximo.obtenerDato(v);
		else
			System.out.print("RunError(194)");
		return null;
	}

	void hacia(int v, boolean b) {
		if (!this.vacia())
			if (primero.igual(v))
				primero.hacia(b);
			else
				proximo.hacia(v, b);
		else
			System.out.print("RunError(194)");

	}

	void desde(int v, boolean b) {

		if (!this.vacia())
			if (primero.igual(v))
				primero.desde(b);
			else
				proximo.desde(v, b);
		else
			System.out.print("runerror(194)");

	}

	boolean seDirigeA(int v) {

		if (!this.vacia())
			if (primero.igual(v))
				return primero.seDirigeA();
			else
				return proximo.seDirigeA(v);
		else

			System.out.print("RunError(194)");
		return false;
	}

	boolean vieneDe(int v) {

		if (!this.vacia())
			if (primero.igual(v))
				return (primero.vieneDe());
			else
				return (proximo.vieneDe(v));
		else
			System.out.print("RunError(194))");
		return false;
	}

	int grado() {

		if (!this.vacia())
			return (1 + proximo.grado());
		else
			return 0;
	}

	int gradoIn() {
		if (!this.vacia())
			if (primero.vieneDe())
				return (1 + proximo.gradoIn());
			else
				return proximo.gradoIn();
		else
			return 0;
	}

	int gradoOut() {
		if (!this.vacia())
			if (primero.seDirigeA())
				return (1 + proximo.gradoOut());
			else
				return proximo.gradoOut();
		else
			return 0;
	}

}
